package com.atguigu.aiproject.service.impl;

import com.atguigu.aiproject.dto.PublishPostDTO;
import com.atguigu.aiproject.dto.ReviewResultDTO;
import com.atguigu.aiproject.service.ContentReviewService;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

@Service
@Slf4j
public class ContentReviewServiceImpl implements ContentReviewService {

    private final ChatClient contentReviewClient;

    public ContentReviewServiceImpl(@Qualifier("contentReviewClient") ChatClient contentReviewClient) {
        this.contentReviewClient = contentReviewClient;
    }
    /**
     * 执行AI内容审核
     */
    @Override
    public ReviewResultDTO performContentReview(PublishPostDTO publishPostDTO) {
        String requestId = generateRequestId();
        log.info("开始AI内容审核, requestId: {}, 标题: {}", requestId, publishPostDTO.getTitle());
        try {
            // 使用 StructuredOutputConverter
            AIContentReviewResult aiResult = contentReviewClient.prompt()
                    .user(buildReviewPrompt(publishPostDTO))
                    .call()
                    .entity(AIContentReviewResult.class); // 关键：直接转换为结构化对象

            // 解析AI响应
            return convertToReviewResultDTO(aiResult, requestId);

        }catch (Exception e) {
            // 其他异常
            log.error("审核系统异常, requestId: {}", requestId, e);
            return new ReviewResultDTO(false, "审核系统异常，转入人工审核",
                    ReviewResultDTO.ReviewType.MANUAL_REVIEW);
        }
    }

    /**
     * 定义结构化输出对应的DTO
     */
    public record AIContentReviewResult(
            @JsonPropertyDescription("是否审核通过")
            boolean approved,

            @JsonPropertyDescription("审核原因")
            String reason,

            @JsonPropertyDescription("风险等级: HIGH, MEDIUM, LOW")
            String riskLevel,

            @JsonPropertyDescription("违规类型列表")
            List<String> violationTypes,

            @JsonPropertyDescription("修改建议列表")
            List<String> suggestions
    ) {}
    /**
     * 构建审核提示词
     */

    private String buildReviewPrompt(PublishPostDTO dto) {
        // 1. 校验必填参数
        validatePublishPostDTO(dto);

        // 2. 特殊字符转义（避免破坏提示词结构）
        String title = escapeSpecialChars(dto.getTitle());
        String cgyName = escapeSpecialChars(Objects.requireNonNullElse(dto.getCgyName(), ""));
        String keyword = escapeSpecialChars(Objects.requireNonNullElse(dto.getKeyword(), ""));
        String content = escapeSpecialChars(dto.getContent());
        return String.format("""
                请对以下内容进行审核，按照中国法律法规和社会主义核心价值观进行判断：
                
                文章标题：%s
                文章分类：%s
                文章标签：%s
                文章内容：%s
                
                请给出审核结论、原因、风险等级、违规类型和建议。
                """,
                title, cgyName, keyword, content
        );
    }
    /**
     * 转换AI结果为业务DTO
     */
    private ReviewResultDTO convertToReviewResultDTO(AIContentReviewResult aiResult, String requestId) {
        ReviewResultDTO result = new ReviewResultDTO(
                aiResult.approved(),
                aiResult.reason() != null ? aiResult.reason() : "无具体原因",
                ReviewResultDTO.ReviewType.AI_REVIEW
        );

        result.setRiskLevel(aiResult.riskLevel() != null ? aiResult.riskLevel() : "MEDIUM");
        result.setViolationTypes(aiResult.violationTypes() != null ? aiResult.violationTypes() : new ArrayList<>());
        result.setSuggestions(aiResult.suggestions() != null ? aiResult.suggestions() : new ArrayList<>());

        log.info("AI审核完成, requestId: {}, 结果: {}", requestId, aiResult.approved() ? "通过" : "拒绝");
        return result;
    }

    //辅助方法如下：
    /**
     * 生成请求ID
     */
    private String generateRequestId() {
        return UUID.randomUUID().toString().substring(0, 8);
    }
    // 校验DTO合法性
    private void validatePublishPostDTO(PublishPostDTO dto) {
        if (dto == null) {
            throw new IllegalArgumentException("审核内容不能为空");
        }
        if (StringUtils.isBlank(dto.getTitle())) {
            throw new IllegalArgumentException("文章标题不能为空");
        }
        if (StringUtils.isBlank(dto.getContent())) {
            throw new IllegalArgumentException("文章内容不能为空");
        }
    }

    // 转义特殊字符（防止引号/换行破坏提示词）
    private String escapeSpecialChars(String input) {
        if (input == null) return "";

        // 只转义可能破坏JSON结构的字符
        return input.replace("\\", "\\\\")
                .replace("\"", "\\\"")
                .replace("\n", "\\n")
                .replace("\r", "\\r")
                .replace("\t", "\\t");
        // 注意：不要替换 ` 字符，保留换行符以便AI理解内容结构
    }
}